/*
 * @ : Copyright (c) 2021 Phytium Information Technology, Inc. 
 *  
 * SPDX-License-Identifier: Apache-2.0.
 * 
 * @Date: 2021-07-26 16:27:00
 * @LastEditTime: 2021-08-03 18:23:43
 * @Description:  This files is for i2c ctrl function definition
 * 
 * @Modify History: 
 *  Ver   Who        Date         Changes
 * ----- ------     --------    --------------------------------------
 * 1.0   Zhugengyu   2021/8/3   init
 */
#ifndef BSP_DRIVERS_DW_I2C_H
#define BSP_DRIVERS_DW_I2C_H

#ifdef __cplusplus
extern "C"
{
#endif

#include "ft_types.h"
#include "ft_debug.h"
#include "ft_error_code.h"

typedef enum
{
    I2C_MASTER = 0, /* i2c主设备 */
    I2C_SLAVE       /* i2c从设备 */
} I2cWorkMode; /* i2c 控制器工作模式 */

typedef enum
{
    I2C_STANDARD_SPEED = 0,
    I2C_FAST_SPEED,
    I2C_HIGH_SPEED,

    I2C_SPEED_MODE_MAX
}I2cSpeed;/* i2c 总线传输速度模式，标准、快速和高速 */

typedef enum
{
    /* slave mode evt */
	I2C_EVT_SLAVE_READ_REQUESTED,
	I2C_EVT_SLAVE_WRITE_REQUESTED,
	I2C_EVT_SLAVE_READ_PROCESSED,
	I2C_EVT_SLAVE_WRITE_RECEIVED,
	I2C_EVT_SLAVE_STOP,

    /* master mode evt */
    I2C_EVT_MASTER_TRANS_ABORTED,
    I2C_EVT_MASTER_READ_DONE,
    I2C_EVT_MASTER_WRITE_DONE,

    MAX_I2C_INTR_EVT
}I2cIntrEvent;/* i2c 中断事件 */

typedef enum
{
	I2C_SPEED_STANDARD_RATE		= 100000, /* 100kb/s */
	I2C_SPEED_FAST_RATE		    = 400000, /* 400kb/s */
	I2C_SPEED_HIGH_RATE		    = 3400000, /* 3.4MB/s */   
}I2cSpeedRate;/* i2c 总线传输速度，标准、快速和高速 */
typedef struct
{
    u32 instanceId;/* i2c 控制器id */
    u32 baseAddr;/* i2c寄存器基地址 */
    u32 irqNum;/* i2c中断号 */
    u32 irqPrority;/* i2c中断优先级 */
    u32 workMode;/* i2c控制器工作模式 */
    u32 busSpeed;/* i2c总线速率 */
    u32 refClk;/* i2c中断优先级 */
    u32 rxThres;/* i2c rx fifo 中断阈值 */
    u32 txThres;/* i2c tx fifo 中断阈值 */
    boolean use7bitAddr;/* true: 使用7bit 地址，false: 使用10bit 地址 */
    char instanceName[12];/* instance name */
}I2cConfig;/* i2c 主/从控制器配置 */

typedef void (*I2cEvtHandler)(void *pCtrl);
#define I2C_CALL_EVT_HANDLER(evt, pCtrl)     \
    if (NULL != (pCtrl)->evtHandlers[(evt)]) \
    {                                        \
        (pCtrl)->evtHandlers[evt]((pCtrl));  \
    }

typedef struct
{
    I2cConfig config;/* i2c 控制器配置 */
    u32 isReady;/* i2c 控制器初始化完成标志 */
    /* i2c trans 中间变量 */
    u32 curTrans;
    u32 lastErr;
    void *prv;

    I2cEvtHandler evtHandlers[MAX_I2C_INTR_EVT];/* i2c事件回调函数 */
}I2cCtrl;

typedef struct
{
    u32 slaveAddr; /* i2c从设备地址 */
    u32 addrLen;   /* i2c从设备地址长度（字节数） */
    u8 *transBuf;  /* 读写数据存放地址 */
    u32 bufLen;    /* 读写数据长度 */
    u8  inChipAddr; /* i2c从设备片内地址 */
} I2cTransPack;

const I2cConfig *I2cLookupConfig(u32 instanceId);
u32 I2cInit(I2cCtrl *pCtrl, const I2cConfig *pConfig);
void I2cRegisterEvtCallback(I2cCtrl *pCtrl, I2cIntrEvent evt, I2cEvtHandler handler);
u32 I2cGetIntrruptMask(I2cCtrl *pCtrl);
void I2cSetIntrruptMask(I2cCtrl *pCtrl, u32 mask, boolean enable);
u32 I2cMasterRead(I2cCtrl *pCtrl, I2cTransPack *pRead);
u32 I2cMasterWrite(I2cCtrl *pCtrl, I2cTransPack *pWrite);
void I2cDumpInfo(I2cCtrl *pCtrl);

#define I2C_SUCCESS          FT_SUCCESS  
#define I2C_ERR_INVAL_PARM   FT_MAKE_ERRCODE(ErrModBsp, ErrBspI2c, BIT(1))
#define I2C_ERR_NOT_READY    FT_MAKE_ERRCODE(ErrModBsp, ErrBspI2c, BIT(2))
#define I2C_ERR_TIMEOUT      FT_MAKE_ERRCODE(ErrModBsp, ErrBspI2c, BIT(3))
#define I2C_ERR_NOT_SUPPORT  FT_MAKE_ERRCODE(ErrModBsp, ErrBspI2c, BIT(4))

#define I2C_DEBUG_TAG "I2C"
#define I2C_ERROR(format, ...)   FT_DEBUG_PRINT_E(I2C_DEBUG_TAG, format, ##__VA_ARGS__)
#define I2C_INFO(format, ...) FT_DEBUG_PRINT_I(I2C_DEBUG_TAG, format, ##__VA_ARGS__)
#define I2C_DEBUG(format, ...) FT_DEBUG_PRINT_D(I2C_DEBUG_TAG, format, ##__VA_ARGS__)

#define I2C_TIMEOUT                500
#define I2C_IS_MASTER(pCtrl)      (I2C_MASTER == (pCtrl)->config.workMode)
#define I2C_IS_SLAVE(pCtrl)       (I2C_SLAVE  == (pCtrl)->config.workMode)

#ifdef __cplusplus
}
#endif

#endif